package com.wind.trademark.common.dao;



import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.wind.trademark.common.vo.PageBean;
import com.wind.trademark.common.vo.PageParam;


public interface BaseDao {

	Serializable save(Object entity);

	/**
	 * @param entity
	 */
	void saveOrUpdate(Object entity);

	<T extends Serializable> void saveOrUpdateAll(Collection<T> collection);

	/**
	 * @param entityClass
	 * @param id
	 */
	<T extends Serializable> T get(Class<T> clazz, Serializable id);

	/**
	 * @param entity
	 */
	void delete(Object entity);

	/**
	 * @param entity
	 */
	void merge(Object entity);

	/**
	 * @param entity
	 */
	<T extends Serializable> List<T> findByProperty(Class<T> clazz,
			String propertyName, Object value);

	/**
	 * @param instance
	 * @return
	 */
	<T extends Serializable> List<T> findByExample(T instance);

	/**
	 * @param instance
	 * @return
	 */
	 <T extends Serializable> List<T> findAll(Class<T> clazz);

	/**
	 * @param instance
	 * @param order
	 * @return
	 */
	<T extends Serializable> List<T> findByExample(T instance, Order[] order);

	/**
	 * getSimpleJdbcTemplate
	 * 
	 * @return
	 */
	SimpleJdbcTemplate getSimpleJdbcTemplate();

	HibernateTemplate getHibernateTemplate();

	JdbcTemplate getJdbcTemplate();

	NamedParameterJdbcTemplate getNamedParameterJdbcTemplate();
	
	<T> PageBean queryPageBeanAndMapping(String sql, PageParam pageParam,
			Class<T> clazz, List<Object> params);

	<T> PageBean queryPageBeanAndMapping(String sql, PageParam pageParam,
			Class<T> clazz, Map<String, Object> params);

	PageBean queryPageBean(String sql, PageParam pageParam,
			Map<String, Object> params);

	PageBean queryPageBean(String sql, PageParam pageParam, List<Object> params);

	void update(Object entity);

	void persist(Object entity);

	<T extends Serializable> T merge(T entity);



}
